#include "ioscheduler.h"
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/epoll.h>
#include <cstring>
#include <cerrno>

using namespace sylar;

char recv_data[4096]; // 接收数据的缓冲区

const char data[] = "GET / HTTP/1.0\r\n\r\n"; // HTTP 请求数据

int sock; // 套接字文件描述符

// 处理读取事件的函数
void func()
{
    recv(sock, recv_data, 4096, 0); // 从套接字中接收数据
    std::cout << recv_data << std::endl << std::endl; // 打印接收到的数据
}

// 处理写入事件的函数
void func2()
{
    send(sock, data, sizeof(data), 0); // 向套接字发送数据
}

int main(int argc, char const *argv[])
{
    IOManager manager(2); // 创建 IO 管理器，使用 2 个线程

    sock = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字

    sockaddr_in server; // 定义服务器地址结构
    server.sin_family = AF_INET; // 设置地址族为 IPv4
    server.sin_port = htons(80);  // 设置端口号为 80（HTTP 标准端口）
    server.sin_addr.s_addr = inet_addr("103.235.46.96"); // 设置服务器 IP 地址

    fcntl(sock, F_SETFL, O_NONBLOCK); // 将套接字设置为非阻塞模式

    connect(sock, (struct sockaddr *)&server, sizeof(server)); // 连接到服务器
    
    // 添加写事件到 IO 管理器，触发时调用 func2
    manager.addEvent(sock, IOManager::WRITE, &func2);
    // 添加读事件到 IO 管理器，触发时调用 func
    manager.addEvent(sock, IOManager::READ, &func);

    std::cout << "event has been posted\n\n"; // 打印事件已发布的提示信息
    
    return 0; // 程序结束
}